/**
 * @file misc_event.c
 * @brief 
 * @author  ()
 * @version 1.0
 * @date 2024-09-13
 * 
 * @copyright Copyright (C) 2019 Queclink Wireless Solutions (ShenZhen) Co., Ltd. All Rights Reserved.
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2024-09-13 <td>1.0     <td>     <td>内容
 * </table>
 */
#include "FreeRTOS.h"
#include "semphr.h"
#include "queue.h"
#include "event_groups.h"
#include "global.h"

#include "misc_log.h"
#include "misc_event.h"
#include "task_misc.h"
#include "bsp.h"
#include "misc/rtc_app.h"
#include "service/include/swei_status.h"


#define SYS_EVT_ALL (SYS_EVT_REBOOT | SYS_EVT_POWEROFF)

EventGroupHandle_t misc_evt_grp = NULL;

/// @brief 初始化事件队列
/// @param  
void misc_event_init(void)
{
    if(misc_evt_grp)
        return;

    misc_evt_grp = xEventGroupCreate();
    if(NULL == misc_evt_grp)
    {
        log_e("create event group failed!\r\n");
    }

    return;
}


/// @brief 发送系统事件
/// @param evt 
/// @return 
int32_t misc_event_set(int32_t evt)
{   
    if(NULL == misc_evt_grp)
        return -EIO;
        
    if(evt & SYS_EVT_ALL)
    {
        if(pdPASS != xEventGroupSetBits(misc_evt_grp, evt))
        {
            log_e("send event to misc_evt_grp failed!\r\n");
            return -EIO;
        }
        
        return 0;
    }
    
    return -EIO;
}


/// @brief 系统事件处理
/// @param  
void misc_event_process(void)
{
    EventBits_t xEventGroupValue;

    if(NULL == misc_evt_grp)
    {
        misc_event_init();
        return;
    }

	/* 获取事件位 */
    xEventGroupValue = xEventGroupWaitBits( misc_evt_grp,/* 事件组的句柄 */
                                            SYS_EVT_ALL,
                                            pdTRUE,     /* 满足添加时清除上面的事件位 */
                                            pdFALSE,    /* 任意事件位被设置就会退出阻塞态 */
                                            0 );/* 不阻塞 */
    /* 根据相应的事件位输出提示信息 */
    if( ( xEventGroupValue &  SYS_EVT_REBOOT) != 0 )
    {
        log_i("system reboot now!\r\n");
        // 1. 检查是否需要保存参数，并记录重启原因
        misc_param_ram2flash();

		/* 2. 保存重启前时间 */
        rtc_save_to_flash(1);

        // 3. 执行重启动作
        bsp_reboot();
    }

    if( ( xEventGroupValue &  SYS_EVT_POWEROFF) != 0 )
    {
        log_i("system poweroff now!\r\n");
        // 1. 检查是否需要保存参数，并记录重启原因
        misc_param_ram2flash();

		/* 2. 保存重启前时间 */
        rtc_save_to_flash(1);

        // 4. 触发仪表关闭锂电池输出
        bsp_poweroff();        
    }
}